#ifndef _THREAD_POOL_H_INCLUDED_
#define _THREAD_POOL_H_INCLUDED_

#ifdef __cplusplus
extern "C" {
#endif  /*__cplusplus*/

#include "thread.h"

#define DEFAULT_THREADS_NUM 4    // 默认线程数
#define DEFAULT_QUEUE_NUM  65535 // 默认的任务队列最大数量


typedef unsigned long         atomic_uint_t;
typedef struct thread_task_s  thread_task_t;    // 线程任务
typedef struct thread_pool_s  thread_pool_t;


// 任务队列以链表的方式进行实现 ， 每一个任务节点的数据
struct thread_task_s {
    thread_task_t       *next;                     // 下一个任务 
    uint_t               id;                        
    void                *ctx;                      // 参数
    void               (*handler)(void *data);     // 函数指针
};

typedef struct {
    thread_task_t        *first;
    thread_task_t        **last;   // 高效之处  用二级指针保存链表尾节点的地址
} thread_pool_queue_t;

// 初始化任务队列（ 这里的任务队列是一个链表 ）
#define thread_pool_queue_init(q)                                         \
    (q)->first = NULL;                                                    \
    (q)->last = &(q)->first

// 线程池的结构
struct thread_pool_s {     
    pthread_mutex_t        mtx;        // 互斥量
    thread_pool_queue_t   queue;       // 任务队列
    int_t                 waiting;     // 等待的任务数 
    pthread_cond_t        cond;       // 条件变量

    char                  *name;       // 线程池的名称
    uint_t                threads;     // 线程数
    int_t                 max_queue;   // 任务队列的最大长度 
};

// 外部接口
thread_task_t *thread_task_alloc(size_t size);                     // 为每一个任务分配内存
int_t thread_task_post( thread_pool_t *tp, thread_task_t *task);   // 加入线程池任务队列
thread_pool_t* thread_pool_init();                  // 初始化线程池        
void thread_pool_destroy(thread_pool_t *tp);        // 销毁线程池

#ifdef __cplusplus
}
#endif // __cplusplus


#endif /* _THREAD_POOL_H_INCLUDED_ */
